/**
 * 用户管理模块
 */
const router = require('koa-router')()
const User = require('./../models/userSchema')
const Counter = require('./../models/counterSchema')
const util = require('./../utils/utils')
const jwt = require('jsonwebtoken')
const md5 = require('md5')
router.prefix('/users')

// 登陆
router.post('/login',async (ctx)=>{
  try {
    const { userName, userPwd } = ctx.request.body;
    /**
     * 返回数据库指定字段，有三种方式
     * 1. 'userId userName userEmail state role deptId roleList'
     * 2. {userId:1,_id:0}
     * 3. select('userId')
     */
    const res = await User.findOne({
      userName,
      // userPwd:md5(userPwd)
      userPwd
    },'userId userName userEmail state role deptId roleList')
    
    
    if(res){
      const data = res._doc;
      const token = jwt.sign({
        data
      },'imooc',{ expiresIn: '1h' })
      data.token = token;
      ctx.body = util.success(data)
    }else{
      ctx.body = util.fail("账号或密码不正确")
    }
  } catch (error) {
    ctx.body = util.fail(error.msg)
  }
})

// 用户列表
router.get('/list',async (ctx,)=>{
  const { userId,userName, state } = ctx.request.query
  const { page,skipIndex } = util.pager(ctx.request.query)
  let params = {}
  if(userId)params.userId = userId
  if(userName)params.userId = userId
  if(state && state != '0')params.state = state
  try {
    // 根据条件查询所有的用户列表
    const query = User.find(params,{_id:0,userPwd:0})
    // 分页
    const list = await query.skip(skipIndex).limit(page.pageSize)
    const total = await User.countDocuments(params)
    ctx.body = util.success({
      page:{
        ...page,
        total
      },
      list
    })
  } catch (error) {
    console.log(err)
    ctx.body = util.fail(`查询异常:${error.stack}`)
  }
})

// 用户删除/批量删除
router.post('/delete', async (ctx)=>{
  // 待删除的用户Id数组
  const {userIds} = ctx.request.body
  // User.updateMany({ $or: [{ userId: 10001 },{ userId: 10002 }] })
  const res = await User.updateMany({ userId: { $in: userIds } }, { state:2 })
  if(res.matchedCount){
    ctx.body = util.success(res,`共删除成功${res.matchedCount}条`)
    return
  }
  ctx.body = util.fail('删除失败')
})

// 用户新增/编辑
router.post('/operate',async (ctx)=>{
  const { userId, userName, userEmail, mobile, job, state, roleList, deptId, action } = ctx.request.body
  if(action == 'add'){
    if(!userName || !userEmail || !deptId){
      ctx.body = util.fail('参数错误',util.CODE.PARAM_ERROR)
      return
    }
    
    const res = await User.findOne({ $or:[ { userName }, { userEmail }] },'_id userName userEmail')
    if(res){
      ctx.body = util.fail(`系统检测到有重复的用户，信息如下:${res.userName} - ${res.userEmail}`)
    }else{
      const doc = await Counter.findOneAndUpdate({ _id:'userId' }, { $inc:{ sequence_value: 1 } }, { new: true })
      try {
        const user = new User({
          userId:doc.sequence_value,
          userName,
          userPwd:md5('123456'),
          userEmail,
          // 默认是普通用户
          role:1, 
          roleList,
          job,
          state,
          deptId,
          mobile
        })
        user.save()
        ctx.body = util.success({},'用户创建成功')
      } catch (error) {
        ctx.body = util.fail(error.stack,'用户创建失败')
      }
    }
  }else{
    if(!deptId){
      ctx.body = util.fail('部门不能为空',util.CODE.PARAM_ERROR)
      return
    }
    try {
      const res = await User.findOneAndUpdate({userId},{ mobile, job, state, roleList, deptId })
      ctx.body = util.success({},'更新成功')
    } catch (error) {
      ctx.body = util.success(error.stack,'更新失败')
    }
  }

})

module.exports = router